/*******************************************************************************
  * 文件：Hardware_System.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：系统
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "Hardware_System.h"

/* 宏定义 *********************************************************************/
// PSW堆栈最大深度
#define u8PSW_STACK_MAX_DEPTH    ((U8) 8)

/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
static U8 u8PswStackPointer = 0;                        // PSW堆栈指针
static __istate_t axPswStack[u8PSW_STACK_MAX_DEPTH];    // PSW堆栈数组

/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名：Hardware_InitSystem
  * 功  能：初始化
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_InitSystem(void)
{
    // 初始化时钟

}

/*******************************************************************************
  * 函数名：Hardware_SystemReset
  * 功  能：系统复位
  * 参  数：无
  * 返回值：无
  * 说  明：利用看门狗复位
*******************************************************************************/
void Hardware_SystemReset(void)
{
    // 利用看门狗复位
    WDTE = 0x00;
}

/*******************************************************************************
  * 函数名：Hardware_DisableInterrupt
  * 功  能：禁止中断
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_DisableInterrupt(void)
{
    __disable_interrupt();
}

/*******************************************************************************
  * 函数名：Hardware_EnableInterrupt
  * 功  能：使能中断
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_EnableInterrupt(void)
{
    __enable_interrupt();
}

/*******************************************************************************
  * 函数名：Hardware_EnterCritical
  * 功  能：进入临界区
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_EnterCritical(void)
{
    __istate_t xState;

    // 关闭中断
    xState = __get_interrupt_state();
    __disable_interrupt();

    // 保存PSW
    axPswStack[u8PswStackPointer] = xState;

    // 更新堆栈指针
    u8PswStackPointer++;
}

/*******************************************************************************
  * 函数名：Hardware_ExitCritical
  * 功  能：退出临界区
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_ExitCritical(void)
{
    __istate_t xState;

    // 更新堆栈指针
    u8PswStackPointer--;

    // 恢复PSW
    xState = axPswStack[u8PswStackPointer];
    __set_interrupt_state(xState);
}

/***************************** 文件结束 ***************************************/
